return {
	{
		"petertriho/nvim-scrollbar",
		event = "BufReadPost",
		config = function()
			require("scrollbar").setup()
		end,
	},
	{
		"lewis6991/gitsigns.nvim",
		event = "BufReadPost",
		dependencies = {
			"petertriho/nvim-scrollbar",
		},
		config = function()
			require("plugin_config.gitsigns")
		end,
	},
	{
		"mhinz/vim-signify",
		event = "BufReadPost",
		config = function()
			vim.g.signify_vcs_list = { "svn" }
		end,
	},
	{
		"kevinhwang91/nvim-hlslens",
		event = "BufReadPost",
		dependencies = {
			"petertriho/nvim-scrollbar",
		},
		config = function()
			require("scrollbar.handlers.search").setup({
				nearest_only = true,
			})
			local opts = { noremap = true, silent = true }
			vim.keymap.set("n", "*", [[*<Cmd>lua require('hlslens').start()<CR>]], opts)
			vim.keymap.set("n", "#", [[#<Cmd>lua require('hlslens').start()<CR>]], opts)
			vim.keymap.set(
				"n",
				"n",
				[[<Cmd>execute('normal! ' . v:count1 . 'n')<CR><Cmd>lua require('hlslens').start()<CR>]],
				opts
			)
			vim.keymap.set(
				"n",
				"N",
				[[<Cmd>execute('normal! ' . v:count1 . 'N')<CR><Cmd>lua require('hlslens').start()<CR>]],
				opts
			)
		end,
	},

	{
		"nvim-telescope/telescope.nvim",
		event = "BufReadPost",
		keys = {
			"<leader>s",
			"<C-p>",
		},
		cmd = {
			"Glg",
			"Gst",
			"Diag",
			"Tags",
		},
		dependencies = {
			{ "nvim-lua/plenary.nvim" },
			{ "BurntSushi/ripgrep" },
		},
		config = function()
			require("plugin_config.telescope")
		end,
	},

	{
		"mg979/vim-visual-multi",
		keys = { { "<C-n>", mode = { "n", "v" } }, "<C-Down>", "<C-Up>" },
		config = function()
			vim.g.VM_maps = { ["I BS"] = "" }
			vim.g.VM_silent_exit = 1
			vim.g.VM_plugins_compatibilty = {
				["lualine.nvim"] = {
					test = function()
						return true
					end,
					enable = 'lua require("lualine").hide{unhide = true}',
					disable = 'lua require("lualine").hide()',
				},
			}
			vim.g.VM_Mono_hl = "Cursor"
			vim.g.VM_Extend_hl = "Visual"
		end,
	},

	{
		"folke/tokyonight.nvim",
		dependencies = "nvim-lualine/lualine.nvim",
		config = function()
			vim.cmd.colorscheme("tokyonight-night")
		end,
	},
	{
		"nvim-lualine/lualine.nvim",
		config = function()
			require("lualine").setup({
				options = { globalstatus = true },
				sections = { lualine_c = { { "filename", path = 1 } } },
			})
		end,
	},

	"kyazdani42/nvim-web-devicons",
	{
		"nvim-tree/nvim-tree.lua",
		event = "VimEnter",
		config = function()
			require("plugin_config.tree")
		end,
	},

	{
		"akinsho/bufferline.nvim",
		event = "BufReadPost",
		config = function()
			require("plugin_config.bufferline")
		end,
	},

	{
		"L3MON4D3/LuaSnip",
		event = "InsertEnter",
		config = function()
			require("plugin_config.luasnip")
		end,
	},

	{
		"hrsh7th/nvim-cmp",
		version = false,
		event = { "BufReadPre", "CmdlineEnter" },
		dependencies = {
			{ "hrsh7th/cmp-nvim-lsp" },
			{ "hrsh7th/cmp-buffer" },
			{ "hrsh7th/cmp-path" },
			{ "hrsh7th/cmp-cmdline" },
			{ "quangnguyen30192/cmp-nvim-tags" },
			{ "saadparwaiz1/cmp_luasnip" },
		},
		config = function()
			require("plugin_config.cmp")
		end,
	},

	{
		"neovim/nvim-lspconfig",
		event = "BufReadPre",
		dependencies = {
			"hrsh7th/cmp-nvim-lsp",
		},
		config = function()
			require("plugin_config.lspconfig")
		end,
	},

	{
		"rmagatti/goto-preview",
		event = "BufEnter",
		config = true, -- necessary as per https://github.com/rmagatti/goto-preview/issues/88
	},
	{
		"williamboman/mason.nvim",
		config = function()
			require("mason").setup()
		end,
	},
	{
		"williamboman/mason-lspconfig.nvim",
		config = function()
			require("mason-lspconfig").setup()
		end,
	},
	{
		"stevearc/conform.nvim",
		event = { "BufWritePre" },
		cmd = { "ConformInfo" },
		keys = {
			{
				-- Customize or remove this keymap to your liking
				"<leader>f",
				function()
					require("conform").format({ async = true })
				end,
				mode = "",
				desc = "Format buffer",
			},
		},
		-- This will provide type hinting with LuaLS
		---@module "conform"
		---@type conform.setupOpts
		opts = {
			-- Define your formatters
			formatters_by_ft = {
				lua = { "stylua" },
				python = { "isort", "black" },
				javascript = { "prettierd", "prettier", stop_after_first = true },
			},
			-- Set default options
			default_format_opts = {
				lsp_format = "fallback",
			},
			-- Set up format-on-save
			format_on_save = { timeout_ms = 500 },
			-- Customize formatters
			formatters = {
				shfmt = {
					prepend_args = { "-i", "2" },
				},
			},
		},
		init = function()
			-- If you want the formatexpr, here is the place to set it
			vim.o.formatexpr = "v:lua.require'conform'.formatexpr()"
		end,
	},
	{
		"nvim-treesitter/nvim-treesitter",
		event = "BufReadPost",
		build = function()
			local ts_update = require("nvim-treesitter.install").update({ with_sync = true })
			ts_update()
		end,
		config = function()
			require("nvim-treesitter.configs").setup({
				ensure_installed = { "c", "cpp", "lua", "python", "rust", "go" },
				highlight = { enable = true },
			})
		end,
	},

	{
		"phaazon/hop.nvim",
		branch = "v2",
		keys = {
			{ "<leader>h", "<Cmd>HopWord<CR>", mode = "n", silent = true },
			{ "<leader>H", "<Cmd>HopWordCurrentLine<CR>", mode = "n", silent = true },
		},
		config = function()
			require("hop").setup()
		end,
	},

	{
		"windwp/nvim-autopairs",
		event = "InsertEnter",
		opts = {
			map_bs = true,
			disable_filetype = { "TelescopePrompt", "scheme", "lisp", "racket" },
		},
	},

	{
		"nmac427/guess-indent.nvim",
		event = "BufReadPre",
		name = "guess-indent",
		opts = {
			auto_cmd = true,
			filetype_exclude = { "scheme", "lisp", "racket" },
		},
	},

	{
		"terrortylor/nvim-comment",
		keys = {
			{ "<C-_>", "<Cmd>CommentToggle<CR>", mode = "n" },
			{ "<C-_>", ":CommentToggle<CR>", mode = "v" },
		},
		name = "nvim_comment",
		opts = { create_mappings = false },
	},

	{
		"akinsho/toggleterm.nvim",
		keys = {
			{
				"<C-t>",
				function()
					vim.cmd(vim.v.count1 .. "ToggleTerm")
				end,
				mode = { "n", "t" },
				silent = true,
			},
		},
		config = function()
			require("toggleterm").setup()
		end,
	},

	{ "junegunn/vim-easy-align", keys = { { "ga", "<Plug>(EasyAlign)", mode = "x" } } },

	{
		"kylechui/nvim-surround",
		keys = {
			"ds",
			"cs",
			{ "s", mode = "v" },
		},
		opts = {
			keymaps = {
				insert = false,
				insert_line = false,
				normal = false,
				normal_cur = false,
				normal_cur_line = false,
				visual_line = false,
				visual = "s",
			},
		},
	},

	{
		"nvimdev/dashboard-nvim",
		event = "VimEnter",
	},
	{
		"folke/todo-comments.nvim",
		cmd = { "TodoTrouble", "TodoTelescope" },
		opts = {},
		keys = {
			{
				"]t",
				function()
					require("todo-comments").jump_next()
				end,
				desc = "Next Todo Comment",
			},
			{
				"[t",
				function()
					require("todo-comments").jump_prev()
				end,
				desc = "Previous Todo Comment",
			},
			{ "<leader>xt", "<cmd>Trouble todo toggle<cr>", desc = "Todo (Trouble)" },
			{ "<leader>st", "<cmd>TodoTelescope<cr>", desc = "Todo" },
		},
	},
	{
		"kdheepak/lazygit.nvim",
		cmd = {
			"LazyGit",
			"LazyGitConfig",
			"LazyGitCurrentFile",
			"LazyGitFilter",
			"LazyGitFilterCurrentFile",
		},
		-- optional for floating window border decoration
		dependencies = {
			"nvim-lua/plenary.nvim",
		},
		-- setting the keybinding for LazyGit with 'keys' is recommended in
		-- order to load the plugin when the command is run for the first time
		keys = {
			{ "<leader>lg", "<cmd>LazyGit<cr>", desc = "LazyGit" },
		},
	},
}
